{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分析用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 每个地区的用户，习惯风俗会有一定的差异，，分析一下地区"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts = df_user['location'].value_counts()\n",
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 平均每个地区，存在的用户个数\n",
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "### 由于，每个地区分的太细，所以分类太多，我们将地区以国家进行划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n8/CvFgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 集中在少部分地区\n",
    "plt.plot(\n",
    "    #索引\n",
    "    range(len(location_value_counts)),\n",
    "    # 存在用户地区\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 根据年龄进行划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用户年龄为空的数据\n",
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取年龄不为空的数据\n",
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 根据年龄进行升序排列\n",
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制年龄分布曲线\n",
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 进行年龄划分\n",
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nASIAvjad6R+0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    # 年龄分类\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    # 标签\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 打分表分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "# 删除 nan\n",
    "\n",
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "## 用户活跃度\n",
    "\n",
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    # 用户索引\n",
    "    range(len(user_value_counts)),\n",
    "    # 打分系数\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### 商品流行度分析\n",
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    # 商品id\n",
    "    range(len(item_value_counts)),\n",
    "    # 商品被打分次数\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "\n",
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据user_id进行表合并\n",
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[109814,\n",
       " 561359,\n",
       " 182843,\n",
       " 854047,\n",
       " 559003,\n",
       " 225863,\n",
       " 80014,\n",
       " 795081,\n",
       " 1124497,\n",
       " 696669,\n",
       " 714705,\n",
       " 108845,\n",
       " 334836,\n",
       " 283236,\n",
       " 707194,\n",
       " 700021,\n",
       " 514144,\n",
       " 343464,\n",
       " 3503,\n",
       " 914936,\n",
       " 183738,\n",
       " 791873,\n",
       " 146542,\n",
       " 13830,\n",
       " 661565,\n",
       " 940198,\n",
       " 213986,\n",
       " 92038,\n",
       " 194541,\n",
       " 298162,\n",
       " 264764,\n",
       " 44535,\n",
       " 611952,\n",
       " 903112,\n",
       " 1000180,\n",
       " 556419,\n",
       " 984178,\n",
       " 77056,\n",
       " 639835,\n",
       " 720292,\n",
       " 1094021,\n",
       " 1012843,\n",
       " 433822,\n",
       " 1105356,\n",
       " 661154,\n",
       " 26315,\n",
       " 835165,\n",
       " 1075319,\n",
       " 910974,\n",
       " 1129357,\n",
       " 1019502,\n",
       " 1091796,\n",
       " 879747,\n",
       " 785428,\n",
       " 1069686,\n",
       " 66776,\n",
       " 380559,\n",
       " 173245,\n",
       " 1021114,\n",
       " 549217,\n",
       " 356781,\n",
       " 702337,\n",
       " 706564,\n",
       " 820391,\n",
       " 153701,\n",
       " 957909,\n",
       " 812972,\n",
       " 704865,\n",
       " 34200,\n",
       " 396491,\n",
       " 184879,\n",
       " 762346,\n",
       " 26904,\n",
       " 738016,\n",
       " 480519,\n",
       " 850854,\n",
       " 1115679,\n",
       " 1050689,\n",
       " 125255,\n",
       " 603355,\n",
       " 1037627,\n",
       " 489419,\n",
       " 1141207,\n",
       " 1014626,\n",
       " 372432,\n",
       " 322461,\n",
       " 1124870,\n",
       " 932183,\n",
       " 793961,\n",
       " 967407,\n",
       " 92547,\n",
       " 21290,\n",
       " 282544,\n",
       " 957015,\n",
       " 405121,\n",
       " 44058,\n",
       " 537630,\n",
       " 738297,\n",
       " 570278,\n",
       " 910727,\n",
       " 881553,\n",
       " 745,\n",
       " 227794,\n",
       " 131300,\n",
       " 1070219,\n",
       " 744617,\n",
       " 186203,\n",
       " 173865,\n",
       " 908486,\n",
       " 17954,\n",
       " 1123656,\n",
       " 791588,\n",
       " 154107,\n",
       " 1146267,\n",
       " 847684,\n",
       " 61104,\n",
       " 676243,\n",
       " 550586,\n",
       " 990926,\n",
       " 69271,\n",
       " 702190,\n",
       " 868371,\n",
       " 730578,\n",
       " 49895,\n",
       " 343636,\n",
       " 878786,\n",
       " 134734,\n",
       " 301956,\n",
       " 780370,\n",
       " 492754,\n",
       " 164367,\n",
       " 119871,\n",
       " 1087784,\n",
       " 812035,\n",
       " 1127295,\n",
       " 642071,\n",
       " 306476,\n",
       " 610679,\n",
       " 816335,\n",
       " 772775,\n",
       " 265226,\n",
       " 1121809,\n",
       " 708259,\n",
       " 1084444,\n",
       " 250748,\n",
       " 349808,\n",
       " 810016,\n",
       " 906351,\n",
       " 130140,\n",
       " 285245,\n",
       " 953660,\n",
       " 43227,\n",
       " 733037,\n",
       " 943139,\n",
       " 946127,\n",
       " 637126,\n",
       " 899696,\n",
       " 59261,\n",
       " 332560,\n",
       " 1093855,\n",
       " 681273,\n",
       " 1083897,\n",
       " 1079444,\n",
       " 288088,\n",
       " 720520,\n",
       " 1048832,\n",
       " 219734,\n",
       " 1143907,\n",
       " 773850,\n",
       " 471658,\n",
       " 713201,\n",
       " 194735,\n",
       " 569903,\n",
       " 1061791,\n",
       " 510109,\n",
       " 426292,\n",
       " 675402,\n",
       " 554798,\n",
       " 835023,\n",
       " 90229,\n",
       " 1049723,\n",
       " 168530,\n",
       " 413337,\n",
       " 1059336,\n",
       " 418380,\n",
       " 35987,\n",
       " 407189,\n",
       " 562560,\n",
       " 484291,\n",
       " 178467,\n",
       " 664856,\n",
       " 175617,\n",
       " 715431,\n",
       " 1127600,\n",
       " 279901,\n",
       " 1120263,\n",
       " 284050,\n",
       " 1014935,\n",
       " 1032400,\n",
       " 835413,\n",
       " 59191,\n",
       " 538657,\n",
       " 1019467,\n",
       " 714125,\n",
       " 830080,\n",
       " 470076,\n",
       " 1051213,\n",
       " 264463,\n",
       " 12500,\n",
       " 1036988,\n",
       " 720150,\n",
       " 256515,\n",
       " 109964,\n",
       " 756328,\n",
       " 966286,\n",
       " 758835,\n",
       " 882401,\n",
       " 661665,\n",
       " 752186,\n",
       " 454231,\n",
       " 941719,\n",
       " 719392,\n",
       " 403639,\n",
       " 378905,\n",
       " 801897,\n",
       " 130950,\n",
       " 869746,\n",
       " 787134,\n",
       " 1049571,\n",
       " 556750,\n",
       " 366747,\n",
       " 789377,\n",
       " 772836,\n",
       " 145037,\n",
       " 620545,\n",
       " 256537,\n",
       " 556617,\n",
       " 1054510,\n",
       " 675773,\n",
       " 115157,\n",
       " 798144,\n",
       " 108221,\n",
       " 814571,\n",
       " 626029,\n",
       " 225372,\n",
       " 976325,\n",
       " 680935,\n",
       " 508920,\n",
       " 934119,\n",
       " 557662,\n",
       " 921114,\n",
       " 721532,\n",
       " 520960,\n",
       " 955223,\n",
       " 1050664,\n",
       " 576761,\n",
       " 707114,\n",
       " 102275,\n",
       " 382113,\n",
       " 258661,\n",
       " 41758,\n",
       " 897832,\n",
       " 1041148,\n",
       " 276592,\n",
       " 1001016,\n",
       " 1122197,\n",
       " 89674,\n",
       " 986307,\n",
       " 1136472,\n",
       " 296855,\n",
       " 683338,\n",
       " 775486,\n",
       " 463170,\n",
       " 67431,\n",
       " 971833,\n",
       " 1057208,\n",
       " 605469,\n",
       " 29229,\n",
       " 672395,\n",
       " 810551,\n",
       " 477263,\n",
       " 131356,\n",
       " 531338,\n",
       " 597882,\n",
       " 352364,\n",
       " 872534,\n",
       " 749995,\n",
       " 891240,\n",
       " 91029,\n",
       " 27200,\n",
       " 1041885,\n",
       " 345546,\n",
       " 415741,\n",
       " 97771,\n",
       " 565077,\n",
       " 1100527,\n",
       " 347977,\n",
       " 1114073,\n",
       " 406967,\n",
       " 634918,\n",
       " 1048237,\n",
       " 980191,\n",
       " 470048,\n",
       " 592334,\n",
       " 1106898,\n",
       " 193270,\n",
       " 216484,\n",
       " 928435,\n",
       " 1142866,\n",
       " 585733,\n",
       " 409571,\n",
       " 1092000,\n",
       " 142134,\n",
       " 822887,\n",
       " 852309,\n",
       " 940689,\n",
       " 232674,\n",
       " 126147,\n",
       " 907352,\n",
       " 914382,\n",
       " 1084838,\n",
       " 747563,\n",
       " 322642,\n",
       " 1034354,\n",
       " 282193,\n",
       " 407811,\n",
       " 443820,\n",
       " 506066,\n",
       " 78762,\n",
       " 512709,\n",
       " 436574,\n",
       " 154014,\n",
       " 846516,\n",
       " 54238,\n",
       " 22976,\n",
       " 864494,\n",
       " 675113,\n",
       " 1146990,\n",
       " 62809,\n",
       " 87748,\n",
       " 517014,\n",
       " 913653,\n",
       " 611074,\n",
       " 389919,\n",
       " 637921,\n",
       " 236389,\n",
       " 592546,\n",
       " 681184,\n",
       " 444619,\n",
       " 1081071,\n",
       " 54455,\n",
       " 758189,\n",
       " 320601,\n",
       " 977053,\n",
       " 471720,\n",
       " 868825,\n",
       " 465671,\n",
       " 1070707,\n",
       " 911428,\n",
       " 819301,\n",
       " 396273,\n",
       " 818071,\n",
       " 161624,\n",
       " 1042144,\n",
       " 89327,\n",
       " 601433,\n",
       " 291971,\n",
       " 997501,\n",
       " 224059,\n",
       " 264196,\n",
       " 255861,\n",
       " 964908,\n",
       " 740050,\n",
       " 36537,\n",
       " 933298,\n",
       " 1092348,\n",
       " 740307,\n",
       " 605566,\n",
       " 760831,\n",
       " 447476,\n",
       " 819118,\n",
       " 99059,\n",
       " 221725,\n",
       " 1066443,\n",
       " 198929,\n",
       " 681289,\n",
       " 173582,\n",
       " 431910,\n",
       " 805900,\n",
       " 377060,\n",
       " 878265,\n",
       " 264549,\n",
       " 996491,\n",
       " 294801,\n",
       " 11146,\n",
       " 340925,\n",
       " 180998,\n",
       " 694210,\n",
       " 67719,\n",
       " 205964,\n",
       " 307042,\n",
       " 459429,\n",
       " 959669,\n",
       " 902206,\n",
       " 421152,\n",
       " 848645,\n",
       " 125043,\n",
       " 118215,\n",
       " 318132,\n",
       " 239885,\n",
       " 967488,\n",
       " 189346,\n",
       " 281709,\n",
       " 86357,\n",
       " 752736,\n",
       " 921644,\n",
       " 432745,\n",
       " 501516,\n",
       " 493109,\n",
       " 904503,\n",
       " 716087,\n",
       " 299906,\n",
       " 187491,\n",
       " 20009,\n",
       " 611709,\n",
       " 686569,\n",
       " 840353,\n",
       " 724681,\n",
       " 480043,\n",
       " 127664,\n",
       " 121540,\n",
       " 135482,\n",
       " 231375,\n",
       " 523609,\n",
       " 604122,\n",
       " 491725,\n",
       " 262383,\n",
       " 1687,\n",
       " 1139035,\n",
       " 552101,\n",
       " 882632,\n",
       " 771216,\n",
       " 777227,\n",
       " 273156,\n",
       " 874231,\n",
       " 69671,\n",
       " 606766,\n",
       " 733699,\n",
       " 657401,\n",
       " 6892,\n",
       " 735140,\n",
       " 1061919,\n",
       " 6079,\n",
       " 616845,\n",
       " 167530,\n",
       " 793819,\n",
       " 385169,\n",
       " 682915,\n",
       " 932641,\n",
       " 219400,\n",
       " 1119979,\n",
       " 416757,\n",
       " 836914,\n",
       " 148076,\n",
       " 401981,\n",
       " 430634,\n",
       " 751340,\n",
       " 896262,\n",
       " 1008449,\n",
       " 594122,\n",
       " 1142270,\n",
       " 342581,\n",
       " 812204,\n",
       " 56025,\n",
       " 546023,\n",
       " 65258,\n",
       " 338387,\n",
       " 404069,\n",
       " 766551,\n",
       " 385881,\n",
       " 211420,\n",
       " 286015,\n",
       " 212640,\n",
       " 567175,\n",
       " 254291,\n",
       " 154333,\n",
       " 757303,\n",
       " 119078,\n",
       " 534461,\n",
       " 757390,\n",
       " 272820,\n",
       " 528632,\n",
       " 861400,\n",
       " 194544,\n",
       " 545223,\n",
       " 1089301,\n",
       " 250353,\n",
       " 1121839,\n",
       " 253657,\n",
       " 691618,\n",
       " 601670,\n",
       " 646787,\n",
       " 921714,\n",
       " 492782,\n",
       " 11221,\n",
       " 196228,\n",
       " 237492,\n",
       " 211657,\n",
       " 924725,\n",
       " 814234,\n",
       " 752392,\n",
       " 378105,\n",
       " 277462,\n",
       " 812471,\n",
       " 730,\n",
       " 871071,\n",
       " 439680,\n",
       " 503279,\n",
       " 8960,\n",
       " 874948,\n",
       " 271879,\n",
       " 175857,\n",
       " 366271,\n",
       " 1124340,\n",
       " 559272,\n",
       " 883535,\n",
       " 352631,\n",
       " 818167,\n",
       " 640838,\n",
       " 136144,\n",
       " 49969,\n",
       " 255885,\n",
       " 825624,\n",
       " 558081,\n",
       " 112323,\n",
       " 1140006,\n",
       " 394254,\n",
       " 650814,\n",
       " 653065,\n",
       " 1147987,\n",
       " 709294,\n",
       " 47523,\n",
       " 304645,\n",
       " 646161,\n",
       " 597447,\n",
       " 419355,\n",
       " 895433,\n",
       " 444527,\n",
       " 1043320,\n",
       " 94302,\n",
       " 886512,\n",
       " 137703,\n",
       " 322871,\n",
       " 356838,\n",
       " 99285,\n",
       " 466357,\n",
       " 131556,\n",
       " 941570,\n",
       " 398080,\n",
       " 840368,\n",
       " 910220,\n",
       " 1121554,\n",
       " 765728,\n",
       " 156459,\n",
       " 453377,\n",
       " 188095,\n",
       " 921317,\n",
       " 89614,\n",
       " 1121836,\n",
       " 653176,\n",
       " 65505,\n",
       " 436695,\n",
       " 74733,\n",
       " 327544,\n",
       " 1101688,\n",
       " 206803,\n",
       " 106452,\n",
       " 863570,\n",
       " 990900,\n",
       " 806012,\n",
       " 699942,\n",
       " 382605,\n",
       " 848726,\n",
       " 898912,\n",
       " 217962,\n",
       " 183103,\n",
       " 91237,\n",
       " 452969,\n",
       " 319263,\n",
       " 285083,\n",
       " 633261,\n",
       " 765021,\n",
       " 1069771,\n",
       " 882484,\n",
       " 551957,\n",
       " 594903,\n",
       " 861875,\n",
       " 385935,\n",
       " 1118852,\n",
       " 1109686,\n",
       " 192149,\n",
       " 4978,\n",
       " 302044,\n",
       " 1089983,\n",
       " 212087,\n",
       " 952204,\n",
       " 516509,\n",
       " 1005376,\n",
       " 61762,\n",
       " 779435,\n",
       " 621299,\n",
       " 976012,\n",
       " 783233,\n",
       " 596045,\n",
       " 1129327,\n",
       " 710147,\n",
       " 416666,\n",
       " 354801,\n",
       " 83209,\n",
       " 786209,\n",
       " 109864,\n",
       " 203064,\n",
       " 1029344,\n",
       " 781087,\n",
       " 883687,\n",
       " 371620,\n",
       " 219616,\n",
       " 152751,\n",
       " 485551,\n",
       " 804665,\n",
       " 284784,\n",
       " 1062166,\n",
       " 208527,\n",
       " 1023643,\n",
       " 1102436,\n",
       " 485971,\n",
       " 1101458,\n",
       " 1043396,\n",
       " 703065,\n",
       " 661239,\n",
       " 872957,\n",
       " 560817,\n",
       " 708507,\n",
       " 1008496,\n",
       " 370053,\n",
       " 493413,\n",
       " 214148,\n",
       " 110598,\n",
       " 1081654,\n",
       " 301385,\n",
       " 773880,\n",
       " 84976,\n",
       " 294237,\n",
       " 308638,\n",
       " 350728,\n",
       " 837626,\n",
       " 375029,\n",
       " 522242,\n",
       " 1066677,\n",
       " 383039,\n",
       " 1019013,\n",
       " 1048855,\n",
       " 10991,\n",
       " 986913,\n",
       " 326666,\n",
       " 580262,\n",
       " 734385,\n",
       " 1058912,\n",
       " 920159,\n",
       " 471446,\n",
       " 140275,\n",
       " 895225,\n",
       " 990655,\n",
       " 831120,\n",
       " 668110,\n",
       " 99155,\n",
       " 900474,\n",
       " 873334,\n",
       " 185073,\n",
       " 686426,\n",
       " 929899,\n",
       " 972748,\n",
       " 30341,\n",
       " 234151,\n",
       " 79704,\n",
       " 739630,\n",
       " 765748,\n",
       " 671750,\n",
       " 499782,\n",
       " 1149754,\n",
       " 998463,\n",
       " 715449,\n",
       " 489815,\n",
       " 68495,\n",
       " 387247,\n",
       " 265647,\n",
       " 941170,\n",
       " 424322,\n",
       " 983346,\n",
       " 898770,\n",
       " 29876,\n",
       " 730205,\n",
       " 262216,\n",
       " 564486,\n",
       " 747551,\n",
       " 1141674,\n",
       " 651711,\n",
       " 149932,\n",
       " 725600,\n",
       " 431650,\n",
       " 98373,\n",
       " 247675,\n",
       " 269563,\n",
       " 1084426,\n",
       " 21081,\n",
       " 1019358,\n",
       " 1080897,\n",
       " 881715,\n",
       " 838210,\n",
       " 1047647,\n",
       " 134457,\n",
       " 395178,\n",
       " 384724,\n",
       " 732095,\n",
       " 480006,\n",
       " 690151,\n",
       " 869687,\n",
       " 1024044,\n",
       " 245292,\n",
       " 830302,\n",
       " 153605,\n",
       " 753034,\n",
       " 1068851,\n",
       " 787618,\n",
       " 214983,\n",
       " 410952,\n",
       " 539302,\n",
       " 187985,\n",
       " 253860,\n",
       " 772147,\n",
       " 366816,\n",
       " 398503,\n",
       " 172810,\n",
       " 137151,\n",
       " 885524,\n",
       " 940566,\n",
       " 915974,\n",
       " 938218,\n",
       " 84673,\n",
       " 869504,\n",
       " 108104,\n",
       " 196960,\n",
       " 627310,\n",
       " 1064306,\n",
       " 823297,\n",
       " 789417,\n",
       " 696949,\n",
       " 771291,\n",
       " 732272,\n",
       " 132346,\n",
       " 698591,\n",
       " 388873,\n",
       " 253950,\n",
       " 56545,\n",
       " 931959,\n",
       " 821739,\n",
       " 1048758,\n",
       " 673920,\n",
       " 69142,\n",
       " 429117,\n",
       " 601889,\n",
       " 662863,\n",
       " 602012,\n",
       " 318152,\n",
       " 670651,\n",
       " 989202,\n",
       " 756439,\n",
       " 474776,\n",
       " 1120703,\n",
       " 72267,\n",
       " 987566,\n",
       " 326563,\n",
       " 436186,\n",
       " 692428,\n",
       " 504832,\n",
       " 997963,\n",
       " 464807,\n",
       " 654636,\n",
       " 341123,\n",
       " 412899,\n",
       " 972134,\n",
       " 1011474,\n",
       " 693777,\n",
       " 998308,\n",
       " 937273,\n",
       " 971488,\n",
       " 565547,\n",
       " 915108,\n",
       " 615375,\n",
       " 166356,\n",
       " 825550,\n",
       " 977247,\n",
       " 206661,\n",
       " 675497,\n",
       " 802724,\n",
       " 1112313,\n",
       " 271197,\n",
       " 488947,\n",
       " 120296,\n",
       " 337667,\n",
       " 872923,\n",
       " 1067939,\n",
       " 931441,\n",
       " 571915,\n",
       " 492963,\n",
       " 609368,\n",
       " 366935,\n",
       " 1091089,\n",
       " 497956,\n",
       " 875022,\n",
       " 173847,\n",
       " 808617,\n",
       " 1148637,\n",
       " 132492,\n",
       " 772276,\n",
       " 976831,\n",
       " 282847,\n",
       " 352816,\n",
       " 722030,\n",
       " 269181,\n",
       " 293044,\n",
       " 638183,\n",
       " 872316,\n",
       " 323973,\n",
       " 336192,\n",
       " 952491,\n",
       " 562512,\n",
       " 486553,\n",
       " 411430,\n",
       " 622232,\n",
       " 401121,\n",
       " 103150,\n",
       " 648223,\n",
       " 402254,\n",
       " 938155,\n",
       " 53999,\n",
       " 379389,\n",
       " 332318,\n",
       " 698432,\n",
       " 338213,\n",
       " 683223,\n",
       " 82865,\n",
       " 210899,\n",
       " 510396,\n",
       " 86585,\n",
       " 728612,\n",
       " 451989,\n",
       " 175258,\n",
       " 366484,\n",
       " 968530,\n",
       " 912529,\n",
       " 360797,\n",
       " 198188,\n",
       " 1099292,\n",
       " 106377,\n",
       " 497123,\n",
       " 213959,\n",
       " 869164,\n",
       " 326679,\n",
       " 498099,\n",
       " 643532,\n",
       " 358249,\n",
       " 944903,\n",
       " 268112,\n",
       " 773413,\n",
       " 838469,\n",
       " 47282,\n",
       " 1022339,\n",
       " 652032,\n",
       " 908495,\n",
       " 905702,\n",
       " 334966,\n",
       " 301381,\n",
       " 403577,\n",
       " 479885,\n",
       " 627810,\n",
       " 924923,\n",
       " 1060676,\n",
       " 306722,\n",
       " 413855,\n",
       " 333149,\n",
       " 1110303,\n",
       " 353721,\n",
       " 487363,\n",
       " 1045670,\n",
       " 248936,\n",
       " 198066,\n",
       " 634702,\n",
       " 371650,\n",
       " 34206,\n",
       " 1046159,\n",
       " 849686,\n",
       " 485076,\n",
       " 485994,\n",
       " 905554,\n",
       " 163568,\n",
       " 562565,\n",
       " 527432,\n",
       " 623014,\n",
       " 557870,\n",
       " 495074,\n",
       " 317657,\n",
       " 428469,\n",
       " 398744,\n",
       " 18562,\n",
       " 189848,\n",
       " 859949,\n",
       " 1075705,\n",
       " 634375,\n",
       " 1023988,\n",
       " 148905,\n",
       " 389049,\n",
       " 974997,\n",
       " 677793,\n",
       " 1058551,\n",
       " 151076,\n",
       " 914491,\n",
       " 1141980,\n",
       " 650380,\n",
       " 201003,\n",
       " 945582,\n",
       " 51170,\n",
       " 296587,\n",
       " 555883,\n",
       " 700745,\n",
       " 266862,\n",
       " 924954,\n",
       " 980983,\n",
       " 634185,\n",
       " 244015,\n",
       " 1038214,\n",
       " 1006276,\n",
       " 735650,\n",
       " 781706,\n",
       " 260931,\n",
       " 483990,\n",
       " 751646,\n",
       " 533716,\n",
       " 560773,\n",
       " 1105305,\n",
       " 193499,\n",
       " 217048,\n",
       " 19277,\n",
       " 727195,\n",
       " 784726,\n",
       " 944158,\n",
       " 938337,\n",
       " 812435,\n",
       " 315791,\n",
       " 374101,\n",
       " 503888,\n",
       " 376309,\n",
       " 696965,\n",
       " 434083,\n",
       " 950254,\n",
       " 301236,\n",
       " 511392,\n",
       " 898230,\n",
       " 779934,\n",
       " 791880,\n",
       " 337612,\n",
       " 541850,\n",
       " 768051,\n",
       " 829422,\n",
       " 1121091,\n",
       " 907689,\n",
       " 11869,\n",
       " 484354,\n",
       " 995680,\n",
       " 472817,\n",
       " 481443,\n",
       " 324567,\n",
       " 721185,\n",
       " 932828,\n",
       " 671763,\n",
       " 7845,\n",
       " 977803,\n",
       " 706265,\n",
       " 952390,\n",
       " 113574,\n",
       " 497935,\n",
       " 47926,\n",
       " 544254,\n",
       " 279500,\n",
       " 568045,\n",
       " 382396,\n",
       " 1030814,\n",
       " 382315,\n",
       " 333850,\n",
       " 507412,\n",
       " ...]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#设置随机种子，划分数据集\n",
    "random.seed(123)\n",
    "text_index_s = random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data) * 0.3)\n",
    ")\n",
    "text_index_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试集\n",
    "df_data_text = df_data.loc[\n",
    "    text_index_s\n",
    "]\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   344931 non-null  int64 \n",
      " 1   location  344931 non-null  object\n",
      " 2   age       344931 non-null  int64 \n",
      " 3   item_id   344931 non-null  object\n",
      " 4   rating    344931 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 14.5+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_text.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练集\n",
    "df_data_training = df_data[\n",
    "    ~df_data.index.isin(text_index_s)\n",
    "]\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data_text,open('./data/df_data_text.pkl','wb')\n",
    ")\n",
    "cPickle.dump(\n",
    "    df_data_training,open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 804841 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   804841 non-null  int64 \n",
      " 1   location  804841 non-null  object\n",
      " 2   age       804841 non-null  int64 \n",
      " 3   item_id   804841 non-null  object\n",
      " 4   rating    804841 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 33.8+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " '',\n",
       " 'australia',\n",
       " 'spain',\n",
       " 'france',\n",
       " 'n/a',\n",
       " 'italy',\n",
       " 'portugal']"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 地区排名\n",
    "df_data_training['location'].value_counts()[:11].index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "top10_location = ['usa',\n",
    " 'canada',\n",
    " 'united kingdom',\n",
    " 'germany',\n",
    " 'australia',\n",
    " 'spain',\n",
    " 'france',\n",
    " 'n/a',\n",
    " 'italy',\n",
    " 'portugal']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'df_data_training' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-1-1cacde2c884e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# 、地区要么原样输出，否者输出other\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mdf_data_training\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'location'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdf_data_training\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'location'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mlocation\u001b[0m \u001b[1;33m:\u001b[0m \u001b[0mlocation\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlocation\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtop10_location\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;34m'other'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'df_data_training' is not defined"
     ]
    }
   ],
   "source": [
    "# 、地区要么原样输出，否者输出other\n",
    "df_data_training['location'] = df_data_training['location'].apply(lambda location : location if location in top10_location else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               537641\n",
       "canada             72451\n",
       "other              60023\n",
       "united kingdom     35354\n",
       "germany            27687\n",
       "australia          18604\n",
       "spain              17949\n",
       "france              9735\n",
       "n/a                 9541\n",
       "italy               8482\n",
       "portugal            7374\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 如果有键，就是键，，要不就是字典\n",
    "feature_recommand = defaultdict(dict)\n",
    "feature_recommand_with_rating = defaultdict(dict)\n",
    "\n",
    "# 根据location进行分组\n",
    "for location,groupby_location in df_data_training.groupby('location'):\n",
    "    # 按照年龄\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        item_id_value_counts = groupby_location_age['item_id'].value_counts()\n",
    "        divide_boundary = max(np.percentile(item_id_value_counts,75),5) # 取75%的数字，没有取 5\n",
    "        groupby_location_age_top = groupby_location_age[\n",
    "            groupby_location_age['item_id'].isin(\n",
    "            item_id_value_counts[item_id_value_counts >= divide_boundary].index\n",
    "        )]\n",
    "        # 商品的平均值，进行排序\n",
    "        item_mean_rating = groupby_location_age_top.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20]\n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            {\"%s\" % item_id : round(item_mean_rating[item_id],2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519', '1857022424'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4: ['0091867770'],\n",
       "              5: []},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2: [],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641'],\n",
       "              5: []},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5: []},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667', '0439064872', '059035342X'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: [{'0099771519': 7.0}, {'1857022424': 5.33}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0552998486': 8.8},\n",
       "               {'015602943X': 7.2},\n",
       "               {'0552140295': 6.8},\n",
       "               {'0440220602': 6.6},\n",
       "               {'0446532231': 6.2},\n",
       "               {'0007170866': 6.14},\n",
       "               {'1875989218': 6.09},\n",
       "               {'0099727412': 6.0},\n",
       "               {'0860074382': 5.91},\n",
       "               {'0140008535': 5.86},\n",
       "               {'0385335482': 5.71},\n",
       "               {'0553279556': 5.67},\n",
       "               {'1400034779': 5.4},\n",
       "               {'0743225082': 5.33},\n",
       "               {'0949206318': 5.17}],\n",
       "              4: [{'0091867770': 5.17}],\n",
       "              5: []},\n",
       "             'canada': {0: [{'0140505865': 9.4},\n",
       "               {'0140067477': 7.86},\n",
       "               {'076790592X': 7.4},\n",
       "               {'0553250426': 7.12},\n",
       "               {'0060392452': 7.0},\n",
       "               {'0676974791': 6.83},\n",
       "               {'080410526X': 6.8},\n",
       "               {'1552783081': 6.8},\n",
       "               {'0446350982': 6.8},\n",
       "               {'038079487X': 6.6},\n",
       "               {'0385505833': 6.4},\n",
       "               {'0676972152': 6.4},\n",
       "               {'0786867647': 6.4},\n",
       "               {'0060959037': 6.38},\n",
       "               {'0771099894': 6.25},\n",
       "               {'0812550706': 6.2},\n",
       "               {'0425122123': 6.2},\n",
       "               {'0446667900': 6.12},\n",
       "               {'0671011375': 6.0},\n",
       "               {'1550541129': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0060915544': 8.43},\n",
       "               {'0140042393': 8.33},\n",
       "               {'0552137030': 8.29},\n",
       "               {'0836220889': 7.83},\n",
       "               {'0425105334': 7.8},\n",
       "               {'0836218256': 7.67},\n",
       "               {'0140277439': 7.6},\n",
       "               {'0345338588': 7.6},\n",
       "               {'1853260002': 7.5},\n",
       "               {'0060935464': 7.4},\n",
       "               {'0836218353': 7.2},\n",
       "               {'0671868691': 7.17},\n",
       "               {'0446532231': 7.15},\n",
       "               {'038542017X': 7.14},\n",
       "               {'0440224764': 7.0},\n",
       "               {'0770422578': 7.0},\n",
       "               {'0006485278': 7.0},\n",
       "               {'0451163524': 7.0},\n",
       "               {'0771060548': 6.89},\n",
       "               {'0553287893': 6.83}],\n",
       "              4: [{'0380718839': 8.4},\n",
       "               {'0316666343': 7.57},\n",
       "               {'0345370775': 7.0},\n",
       "               {'0684872153': 6.6},\n",
       "               {'0671758896': 6.2},\n",
       "               {'0676974805': 6.0},\n",
       "               {'0440213525': 5.57},\n",
       "               {'0515111279': 5.43},\n",
       "               {'034540288X': 5.29},\n",
       "               {'0676973094': 5.22},\n",
       "               {'0671027360': 5.2},\n",
       "               {'0684874350': 5.0}],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'2070370003': 9.0},\n",
       "               {'2070408507': 7.33},\n",
       "               {'2253140872': 7.14},\n",
       "               {'2266084372': 7.12},\n",
       "               {'2877302202': 6.8},\n",
       "               {'22530152730': 6.6},\n",
       "               {'2070744833': 6.57},\n",
       "               {'2253072079': 6.4},\n",
       "               {'2277260029': 6.4},\n",
       "               {'2290302155': 6.33},\n",
       "               {'2070363317': 6.2},\n",
       "               {'2253153265': 6.2},\n",
       "               {'2253144452': 6.17},\n",
       "               {'2264016124': 6.17},\n",
       "               {'2226135022': 6.12},\n",
       "               {'2020306492': 6.0},\n",
       "               {'2253154393': 6.0},\n",
       "               {'2290308285': 5.89},\n",
       "               {'2253150711': 5.71},\n",
       "               {'229030039X': 5.6}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: [{'3518366823': 6.8},\n",
       "               {'3423072571': 6.2},\n",
       "               {'3518368540': 6.0},\n",
       "               {'3423203668': 5.33},\n",
       "               {'3426029553': 5.25},\n",
       "               {'3453007867': 5.17},\n",
       "               {'3404148665': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'3551551936': 9.6},\n",
       "               {'3551551693': 9.5},\n",
       "               {'3551551677': 9.5},\n",
       "               {'3423071516': 9.0},\n",
       "               {'3518372742': 8.0},\n",
       "               {'3257230478': 7.67},\n",
       "               {'3442727952': 7.43},\n",
       "               {'3442724686': 7.33},\n",
       "               {'3518100734': 7.33},\n",
       "               {'3596215226': 7.3},\n",
       "               {'3150000017': 7.14},\n",
       "               {'3426612704': 6.89},\n",
       "               {'3423205202': 6.88},\n",
       "               {'3499224615': 6.71},\n",
       "               {'3423202947': 6.7},\n",
       "               {'3442442354': 6.67},\n",
       "               {'3453071174': 6.6},\n",
       "               {'3551551685': 6.5},\n",
       "               {'3423204206': 6.44},\n",
       "               {'3518388762': 6.4}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: [{'8806142100': 6.33},\n",
       "               {'8826703132': 6.08},\n",
       "               {'884590184X': 6.0},\n",
       "               {'8817131628': 5.2}],\n",
       "              2: [],\n",
       "              3: [{'8845205118': 7.67},\n",
       "               {'8807813823': 7.2},\n",
       "               {'8845915700': 7.17},\n",
       "               {'8817106259': 6.29},\n",
       "               {'8807701510': 6.2},\n",
       "               {'8807816067': 6.18},\n",
       "               {'881786983X': 6.0},\n",
       "               {'0743222229': 5.86},\n",
       "               {'8807817039': 5.83},\n",
       "               {'8807814684': 5.5},\n",
       "               {'8806161741': 5.4},\n",
       "               {'884541096X': 5.4},\n",
       "               {'8845290077': 5.29},\n",
       "               {'8817106100': 5.25},\n",
       "               {'0451164075': 5.2},\n",
       "               {'8807816059': 5.1},\n",
       "               {'8804342838': 5.09},\n",
       "               {'9770390107900': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: [{'8826703132': 9.0},\n",
       "               {'0060008024': 8.0},\n",
       "               {'0439064872': 7.38},\n",
       "               {'1558743669': 7.2},\n",
       "               {'0440211727': 7.0},\n",
       "               {'0330332775': 6.8},\n",
       "               {'0140298479': 6.67},\n",
       "               {'0380789019': 6.6},\n",
       "               {'034536676X': 6.5},\n",
       "               {'0446679593': 6.43},\n",
       "               {'0316693251': 6.4},\n",
       "               {'0316693006': 6.4},\n",
       "               {'1400034779': 6.23},\n",
       "               {'0345337662': 6.2},\n",
       "               {'0375706771': 6.2},\n",
       "               {'0385335881': 6.2},\n",
       "               {'0345339681': 6.17},\n",
       "               {'0553296981': 6.17},\n",
       "               {'044651652X': 6.12},\n",
       "               {'0062502182': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0553296981': 9.38},\n",
       "               {'0441001971': 8.6},\n",
       "               {'0590353403': 8.5},\n",
       "               {'0671793489': 8.4},\n",
       "               {'0553213148': 7.6},\n",
       "               {'0515131229': 7.4},\n",
       "               {'0446310786': 7.3},\n",
       "               {'0439139597': 7.22},\n",
       "               {'0345378490': 7.2},\n",
       "               {'0747546290': 7.14},\n",
       "               {'0842329218': 7.14},\n",
       "               {'0312924585': 7.0},\n",
       "               {'3257228007': 6.86},\n",
       "               {'0786868716': 6.83},\n",
       "               {'051513628X': 6.8},\n",
       "               {'0151008116': 6.8},\n",
       "               {'0061092177': 6.8},\n",
       "               {'0375702709': 6.8},\n",
       "               {'0099800403': 6.5},\n",
       "               {'0439136350': 6.45}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'038082101X': 8.86},\n",
       "               {'0439139600': 7.33},\n",
       "               {'0380815923': 6.6},\n",
       "               {'006050918X': 6.4},\n",
       "               {'9505156944': 6.33},\n",
       "               {'0380977788': 5.86},\n",
       "               {'002542730X': 5.75},\n",
       "               {'0460877305': 5.71},\n",
       "               {'0385721234': 5.5},\n",
       "               {'0385413041': 5.4},\n",
       "               {'9726081378': 5.4},\n",
       "               {'0811214982': 5.3},\n",
       "               {'0330262130': 5.2},\n",
       "               {'0880381744': 5.2},\n",
       "               {'0552137030': 5.2},\n",
       "               {'9722113747': 5.17},\n",
       "               {'9580464162': 5.0},\n",
       "               {'9724614565': 5.0},\n",
       "               {'1401201385': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'8445071416': 8.69},\n",
       "               {'8420616893': 8.62},\n",
       "               {'8420613487': 8.6},\n",
       "               {'950491036X': 8.43},\n",
       "               {'8478886508': 8.4},\n",
       "               {'8478886451': 8.4},\n",
       "               {'0156013924': 7.8},\n",
       "               {'8408039369': 7.8},\n",
       "               {'8420636282': 7.6},\n",
       "               {'8495501074': 7.43},\n",
       "               {'8420432113': 7.2},\n",
       "               {'8440627203': 7.17},\n",
       "               {'8445071408': 7.0},\n",
       "               {'0452282152': 7.0},\n",
       "               {'9681501225': 7.0},\n",
       "               {'8445071769': 6.8},\n",
       "               {'8420466034': 6.8},\n",
       "               {'8445071394': 6.8},\n",
       "               {'8423309223': 6.62},\n",
       "               {'8433914545': 6.62}],\n",
       "              4: [{'8408043641': 6}],\n",
       "              5: []},\n",
       "             'united kingdom': {0: [{'0590660543': 6.33},\n",
       "               {'000649840X': 6.17},\n",
       "               {'0330367358': 6.0},\n",
       "               {'0330376519': 6.0},\n",
       "               {'1857027051': 6.0},\n",
       "               {'0749395990': 5.67},\n",
       "               {'0552124753': 5.6},\n",
       "               {'0099771519': 5.33},\n",
       "               {'0749399902': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'1844262553': 8.35},\n",
       "               {'0091891965': 8.2},\n",
       "               {'0140620117': 7.17},\n",
       "               {'0330258648': 7.0},\n",
       "               {'1860465811': 7.0},\n",
       "               {'1857231384': 7.0},\n",
       "               {'0552145424': 6.83},\n",
       "               {'0440206154': 6.67},\n",
       "               {'0552131059': 6.62},\n",
       "               {'0192833596': 6.6},\n",
       "               {'0440235596': 6.6},\n",
       "               {'0552142379': 6.5},\n",
       "               {'0330267388': 6.4},\n",
       "               {'0671024337': 6.4},\n",
       "               {'0380002930': 6.4},\n",
       "               {'0722532938': 6.38},\n",
       "               {'0552149519': 6.2},\n",
       "               {'0140287248': 6.17},\n",
       "               {'0380813815': 6.17},\n",
       "               {'0064407667': 6.12}],\n",
       "              4: [{'1844262553': 8.5},\n",
       "               {'0552147680': 6.6},\n",
       "               {'0552131067': 5.8},\n",
       "               {'0552996181': 5.0}],\n",
       "              5: []},\n",
       "             'usa': {0: [{'0156004801': 9.6},\n",
       "               {'0060256672': 9.33},\n",
       "               {'0971942315': 9.0},\n",
       "               {'1576738167': 9.0},\n",
       "               {'0553351397': 8.83},\n",
       "               {'0441002935': 8.6},\n",
       "               {'0615116426': 8.45},\n",
       "               {'0316735027': 8.33},\n",
       "               {'0140309578': 8.33},\n",
       "               {'0140185232': 8.2},\n",
       "               {'0553148001': 8.17},\n",
       "               {'0395977894': 8.1},\n",
       "               {'0743455967': 8.0},\n",
       "               {'0618002235': 8.0},\n",
       "               {'039480029X': 8.0},\n",
       "               {'0877738513': 8.0},\n",
       "               {'0060248025': 8.0},\n",
       "               {'0807083054': 7.89},\n",
       "               {'0553380958': 7.8},\n",
       "               {'0553213504': 7.8}],\n",
       "              1: [{'0064407667': 9.6},\n",
       "               {'0439064872': 8.0},\n",
       "               {'059035342X': 7.33}],\n",
       "              2: [{'0590353403': 9.44},\n",
       "               {'0440237688': 9.4},\n",
       "               {'0451191137': 8.8},\n",
       "               {'0439139597': 8.36},\n",
       "               {'0679886370': 8.17},\n",
       "               {'0140348107': 8.0},\n",
       "               {'0064472272': 7.71},\n",
       "               {'0439064864': 7.67},\n",
       "               {'0671027344': 7.64},\n",
       "               {'0446608955': 7.56},\n",
       "               {'0394820371': 7.43},\n",
       "               {'0385729332': 7.33},\n",
       "               {'0316666343': 7.29},\n",
       "               {'0385729340': 7.2},\n",
       "               {'0385730586': 7.0},\n",
       "               {'043935806X': 6.62},\n",
       "               {'0439136350': 6.6},\n",
       "               {'1576738159': 6.6},\n",
       "               {'0440439884': 6.4},\n",
       "               {'0345342968': 6.33}],\n",
       "              3: [{'0066238501': 9.88},\n",
       "               {'0517693119': 9.83},\n",
       "               {'0394800389': 9.83},\n",
       "               {'0920668364': 9.67},\n",
       "               {'0395177111': 9.5},\n",
       "               {'0890876789': 9.4},\n",
       "               {'0898159954': 9.4},\n",
       "               {'0316286850': 9.4},\n",
       "               {'0375503803': 9.2},\n",
       "               {'0316779059': 9.0},\n",
       "               {'156402976X': 9.0},\n",
       "               {'0553110845': 9.0},\n",
       "               {'0060256737': 8.83},\n",
       "               {'0060968966': 8.8},\n",
       "               {'0670451932': 8.8},\n",
       "               {'0805013407': 8.6},\n",
       "               {'0060961325': 8.6},\n",
       "               {'0140195831': 8.6},\n",
       "               {'0451525663': 8.6},\n",
       "               {'0451171926': 8.4}],\n",
       "              4: [{'0312303467': 9.4},\n",
       "               {'0060514957': 9.0},\n",
       "               {'0553377868': 8.86},\n",
       "               {'0688167888': 8.4},\n",
       "               {'0399151451': 8.0},\n",
       "               {'1579546463': 8.0},\n",
       "               {'0380977311': 7.86},\n",
       "               {'0553379615': 7.83},\n",
       "               {'0943233828': 7.8},\n",
       "               {'0446532452': 7.57},\n",
       "               {'0553565079': 7.4},\n",
       "               {'0066214769': 7.4},\n",
       "               {'0446322180': 7.29},\n",
       "               {'0439064864': 7.22},\n",
       "               {'0399151613': 7.2},\n",
       "               {'0449911519': 7.2},\n",
       "               {'0451169514': 7.17},\n",
       "               {'0553802461': 7.12},\n",
       "               {'0312983220': 7.0},\n",
       "               {'0312983301': 7.0}],\n",
       "              5: [{'0440234743': 7.6}, {'044022165X': 6.4}]}})"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand_with_rating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "pycharm": {
     "name": "#%% \n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['0971880107',\n",
       " '0316666343',\n",
       " '0385504209',\n",
       " '0312195516',\n",
       " '0060928336',\n",
       " '0679781587',\n",
       " '044023722X',\n",
       " '0142001740',\n",
       " '0316601950',\n",
       " '0671027360',\n",
       " '0446672211',\n",
       " '067976402X',\n",
       " '059035342X',\n",
       " '0375727345',\n",
       " '0440214041',\n",
       " '0452282152',\n",
       " '044021145X',\n",
       " '0440211727',\n",
       " '0345337662',\n",
       " '0804106304',\n",
       " '0440226430',\n",
       " '0156027321',\n",
       " '0060976845',\n",
       " '0060930535',\n",
       " '0440241073',\n",
       " '0345370775',\n",
       " '0743418174',\n",
       " '0671003755',\n",
       " '0671021001',\n",
       " '0312278586',\n",
       " '0446605239',\n",
       " '0786868716',\n",
       " '1400034779',\n",
       " '0440222656',\n",
       " '0440234743',\n",
       " '0345361792',\n",
       " '0440221471',\n",
       " '0440236673',\n",
       " '0316769487',\n",
       " '0385484518',\n",
       " '044022165X',\n",
       " '0345353145',\n",
       " '0345417623',\n",
       " '0440206154',\n",
       " '0375706771',\n",
       " '0446310786',\n",
       " '0446606812',\n",
       " '0060502258',\n",
       " '0446610038',\n",
       " '044651652X',\n",
       " '0440220602',\n",
       " '0440225701',\n",
       " '0439064872',\n",
       " '0345443284',\n",
       " '0440213525',\n",
       " '0671510053',\n",
       " '0140293248',\n",
       " '0060934417',\n",
       " '0385335482',\n",
       " '0452282829',\n",
       " '006101351X',\n",
       " '0375726403',\n",
       " '0375707972',\n",
       " '0440224764',\n",
       " '0316776963',\n",
       " '043935806X',\n",
       " '0316284955',\n",
       " '0312291639',\n",
       " '0385492081',\n",
       " '0385720106',\n",
       " '0345342968',\n",
       " '0385265700',\n",
       " '0684872153',\n",
       " '0375700757',\n",
       " '0380789035',\n",
       " '0060938455',\n",
       " '0375725784',\n",
       " '0553572997',\n",
       " '068484477X',\n",
       " '0842329129',\n",
       " '0316096199',\n",
       " '0385722206',\n",
       " '0061009059',\n",
       " '0312305060',\n",
       " '0060987103',\n",
       " '0553279912',\n",
       " '0440224675',\n",
       " '0345378490',\n",
       " '0671001795',\n",
       " '0142000205',\n",
       " '0345351525',\n",
       " '0684874350',\n",
       " '0446364193',\n",
       " '0060392452',\n",
       " '0345339681',\n",
       " '0446608955',\n",
       " '0316569321',\n",
       " '0743237188',\n",
       " '0446612545',\n",
       " '0446611867',\n",
       " '0345313860',\n",
       " '0440235596',\n",
       " '0515131229',\n",
       " '014028009X',\n",
       " '0805063897',\n",
       " '0449212602',\n",
       " '0380731851',\n",
       " '0345339703',\n",
       " '0553268880',\n",
       " '0345391055',\n",
       " '0671027387',\n",
       " '1558743669',\n",
       " '080410753X',\n",
       " '0440226104',\n",
       " '0679746048',\n",
       " '051513287X',\n",
       " '0345387651',\n",
       " '0380730138',\n",
       " '0679429220',\n",
       " '0446611212',\n",
       " '0804114986',\n",
       " '0345380371',\n",
       " '0385486804',\n",
       " '0380002930',\n",
       " '0060959037',\n",
       " '0425175405',\n",
       " '0060915544',\n",
       " '0399501487',\n",
       " '0064407667',\n",
       " '0786881852',\n",
       " '0312983271',\n",
       " '0440241537',\n",
       " '0446605484',\n",
       " '0446607657',\n",
       " '0553582755',\n",
       " '0345384466',\n",
       " '080410526X',\n",
       " '0312924585',\n",
       " '034540288X',\n",
       " '0553280341',\n",
       " '0060987529',\n",
       " '0451166892',\n",
       " '0380789019',\n",
       " '0312966091',\n",
       " '0425167313',\n",
       " '014025448X',\n",
       " '0140298479',\n",
       " '0140244824',\n",
       " '0062502182',\n",
       " '0439136369',\n",
       " '0449005615',\n",
       " '0679745203',\n",
       " '0425152251',\n",
       " '074343627X',\n",
       " '080411109X',\n",
       " '0060987561',\n",
       " '0425180638',\n",
       " '0425147622',\n",
       " '0380018179',\n",
       " '0070212570',\n",
       " '0425154092',\n",
       " '0440211263',\n",
       " '0446601241',\n",
       " '068484267X',\n",
       " '0446612790',\n",
       " '0449003795',\n",
       " '0060977493',\n",
       " '0515132020',\n",
       " '0671041789',\n",
       " '038079487X',\n",
       " '0061097101',\n",
       " '0743225406',\n",
       " '080411868X',\n",
       " '0385508042',\n",
       " '1573229326',\n",
       " '0312966970',\n",
       " '0385505833',\n",
       " '0871136791',\n",
       " '0671038184',\n",
       " '0425158616',\n",
       " '0345402871',\n",
       " '0312995423',\n",
       " '0312971346',\n",
       " '0767902521',\n",
       " '0609804138',\n",
       " '0451524934',\n",
       " '155874262X',\n",
       " '0553250426',\n",
       " '0812550706',\n",
       " '0385479565',\n",
       " '0345439104',\n",
       " '0425162443',\n",
       " '067102423X',\n",
       " '0440236703',\n",
       " '1400031354',\n",
       " '0141000198',\n",
       " '0385335881',\n",
       " '0449907481',\n",
       " '0446359866',\n",
       " '0312980140',\n",
       " '0671042858',\n",
       " '0440212561',\n",
       " '0425182908',\n",
       " '0380718340',\n",
       " '0375703055',\n",
       " '0767905180',\n",
       " '0316781266',\n",
       " '038550120X',\n",
       " '0425169863',\n",
       " '0553260111',\n",
       " '014023313X',\n",
       " '0385503822',\n",
       " '0380718332',\n",
       " '0553580221',\n",
       " '1559029838',\n",
       " '014029628X',\n",
       " '0451183665',\n",
       " '0316899984',\n",
       " '0312282990',\n",
       " '0066214122',\n",
       " '0671024248',\n",
       " '0743436210',\n",
       " '0451184963',\n",
       " '0439139600',\n",
       " '0553579606',\n",
       " '0375702709',\n",
       " '0439139597',\n",
       " '0441569595',\n",
       " '1573225789',\n",
       " '034538475X',\n",
       " '0345438329',\n",
       " '0671004530',\n",
       " '0446532231',\n",
       " '0446670251',\n",
       " '0671014196',\n",
       " '0553279378',\n",
       " '042511774X',\n",
       " '0553277472',\n",
       " '0439136350',\n",
       " '0515132187',\n",
       " '0446610399',\n",
       " '0140067477',\n",
       " '0590353403',\n",
       " '044651862X',\n",
       " '0451203771',\n",
       " '038572179X',\n",
       " '042516098X',\n",
       " '0671867156',\n",
       " '0316780375',\n",
       " '0399144463',\n",
       " '0375703861',\n",
       " '0425163407',\n",
       " '0515126772',\n",
       " '0312976275',\n",
       " '0142001430',\n",
       " '0440180295',\n",
       " '0446604801',\n",
       " '0452264464',\n",
       " '034541389X',\n",
       " '0553280368',\n",
       " '0345339738',\n",
       " '0345465083',\n",
       " '0060175400',\n",
       " '0553275976',\n",
       " '0671758896',\n",
       " '0449221504',\n",
       " '0449003787',\n",
       " '0316969443',\n",
       " '0440224624',\n",
       " '0140119906',\n",
       " '0345350499',\n",
       " '0446606189',\n",
       " '0345348036',\n",
       " '0553272535',\n",
       " '0767900383',\n",
       " '0345413903',\n",
       " '0515128554',\n",
       " '0842329218',\n",
       " '055356451X',\n",
       " '0385498802',\n",
       " '0446607711',\n",
       " '0671004573',\n",
       " '0446516538',\n",
       " '0385336179',\n",
       " '0142001805',\n",
       " '0441003257',\n",
       " '002542730X',\n",
       " '0425147584',\n",
       " '0515130389',\n",
       " '0345339711',\n",
       " '0061015725',\n",
       " '0451156609',\n",
       " '0425116840',\n",
       " '0099771519',\n",
       " '0440235162',\n",
       " '0446608815',\n",
       " '0060391626',\n",
       " '0553375407',\n",
       " '140003065X',\n",
       " '0684801523',\n",
       " '0684848783',\n",
       " '0439064864',\n",
       " '0060921145',\n",
       " '0553279556',\n",
       " '0385721420',\n",
       " '0312421273',\n",
       " '0804111359',\n",
       " '0446394521',\n",
       " '0451167317',\n",
       " '031298328X',\n",
       " '0743227441',\n",
       " '0553579754',\n",
       " '0425083837',\n",
       " '042510107X',\n",
       " '0553271636',\n",
       " '0440219078',\n",
       " '067088300X',\n",
       " '0345413350',\n",
       " '0449221512',\n",
       " '0451526341',\n",
       " '0425143325',\n",
       " '0553582747',\n",
       " '0553284789',\n",
       " '0385474016',\n",
       " '0553574574',\n",
       " '0449219364',\n",
       " '0312980159',\n",
       " '0425133540',\n",
       " '0749397543',\n",
       " '0446610100',\n",
       " '0440498058',\n",
       " '0451203895',\n",
       " '0525947647',\n",
       " '0441172717',\n",
       " '0553582526',\n",
       " '0380813815',\n",
       " '0312243022',\n",
       " '006016848X',\n",
       " '0375703063',\n",
       " '044022103X',\n",
       " '0312983867',\n",
       " '0151008116',\n",
       " '0671617028',\n",
       " '0553578693',\n",
       " '0553582135',\n",
       " '0385720955',\n",
       " '014100018X',\n",
       " '0440414806',\n",
       " '0671727796',\n",
       " '0451172817',\n",
       " '0671004107',\n",
       " '0786817070',\n",
       " '0375705856',\n",
       " '0385497466',\n",
       " '0316969680',\n",
       " '0449221482',\n",
       " '0449223612',\n",
       " '0446606324',\n",
       " '1558745157',\n",
       " '037570504X',\n",
       " '0446604666',\n",
       " '0440998050',\n",
       " '031242227X',\n",
       " '0449223604',\n",
       " '0446679593',\n",
       " '0345378482',\n",
       " '0425115801',\n",
       " '0671011367',\n",
       " '0375502238',\n",
       " '0440223202',\n",
       " '0449221490',\n",
       " '0446360589',\n",
       " '0425109720',\n",
       " '0812511816',\n",
       " '0515128546',\n",
       " '0743412028',\n",
       " '038550926X',\n",
       " '0451177096',\n",
       " '0449219461',\n",
       " '0553296981',\n",
       " '0553289411',\n",
       " '0670865796',\n",
       " '0671028375',\n",
       " '0446611808',\n",
       " '0061097314',\n",
       " '042513525X',\n",
       " '0553571885',\n",
       " '0425144429',\n",
       " '0316089699',\n",
       " '051513628X',\n",
       " '0425182878',\n",
       " '0440221595',\n",
       " '0671888587',\n",
       " '0671793489',\n",
       " '0553273914',\n",
       " '0060958022',\n",
       " '0425172546',\n",
       " '0679744398',\n",
       " '038082101X',\n",
       " '0425147363',\n",
       " '0385511612',\n",
       " '0446531332',\n",
       " '0345368754',\n",
       " '0553250531',\n",
       " '0767905385',\n",
       " '0440224594',\n",
       " '0553292722',\n",
       " '0671004565',\n",
       " '0345427637',\n",
       " '0679751521',\n",
       " '0345447840',\n",
       " '0451202341',\n",
       " '0671042262',\n",
       " '1558744150',\n",
       " '089480829X',\n",
       " '0312990456',\n",
       " '038549081X',\n",
       " '0373218397',\n",
       " '0446603589',\n",
       " '0399150897',\n",
       " '0345391802',\n",
       " '0312422156',\n",
       " '0786885688',\n",
       " '0671004549',\n",
       " '0380710218',\n",
       " '0440213290',\n",
       " '0671894455',\n",
       " '0679731148',\n",
       " '0345370805',\n",
       " '0446611085',\n",
       " '0446364800',\n",
       " '0679735909',\n",
       " '0446609404',\n",
       " '0312265867',\n",
       " '0156628708',\n",
       " '0452283205',\n",
       " '055321313X',\n",
       " '0345384369',\n",
       " '0743206045',\n",
       " '0671673688',\n",
       " '0425122123',\n",
       " '0671867113',\n",
       " '0452260116',\n",
       " '0743411250',\n",
       " '0743418204',\n",
       " '0451160525',\n",
       " '0375506039',\n",
       " '0440202043',\n",
       " '0515121843',\n",
       " '0670892963',\n",
       " '0553582127',\n",
       " '0312983824',\n",
       " '0671708635',\n",
       " '0425180964',\n",
       " '0671867172',\n",
       " '0345435168',\n",
       " '0553564528',\n",
       " '0802130208',\n",
       " '0385420161',\n",
       " '0375727132',\n",
       " '0743460529',\n",
       " '0452269571',\n",
       " '0670880728',\n",
       " '0670894184',\n",
       " '039592720X',\n",
       " '0446603716',\n",
       " '0842342702',\n",
       " '0786867647',\n",
       " '0316789089',\n",
       " '1878424319',\n",
       " '0345446860',\n",
       " '0441790348',\n",
       " '0373218192',\n",
       " '0553561618',\n",
       " '0553573136',\n",
       " '0345369947',\n",
       " '0743224574',\n",
       " '0399147195',\n",
       " '0671568175',\n",
       " '051512608X',\n",
       " '0451186362',\n",
       " '0374129983',\n",
       " '055356160X',\n",
       " '0385424728',\n",
       " '0452284449',\n",
       " '0425170349',\n",
       " '0446611778',\n",
       " '0515135062',\n",
       " '0743467523',\n",
       " '0330332775',\n",
       " '0553569910',\n",
       " '038533334X',\n",
       " '0385730586',\n",
       " '0060173289',\n",
       " '0425124347',\n",
       " '1558744630',\n",
       " '0345424719',\n",
       " '0452280621',\n",
       " '0553581554',\n",
       " '0440215625',\n",
       " '0345386108',\n",
       " '0446608890',\n",
       " '0671042572',\n",
       " '0385502532',\n",
       " '0375760911',\n",
       " '0449227421',\n",
       " '0140177396',\n",
       " '0449006522',\n",
       " '0743211383',\n",
       " '0425107469',\n",
       " '0380730847',\n",
       " '0064407675',\n",
       " '0394820371',\n",
       " '0679444815',\n",
       " '0552124753',\n",
       " '0451176464',\n",
       " '0373218036',\n",
       " '0451181379',\n",
       " '0515127833',\n",
       " '0060929871',\n",
       " '0064472272',\n",
       " '0316781010',\n",
       " '0380012863',\n",
       " '0060922532',\n",
       " '0842329242',\n",
       " '0316666009',\n",
       " '0743437640',\n",
       " '0451169530',\n",
       " '0446520802',\n",
       " '0553582143',\n",
       " '0375412824',\n",
       " '0515136530',\n",
       " '0679772677',\n",
       " '0802139256',\n",
       " '038529929X',\n",
       " '0385472951',\n",
       " '0380717018',\n",
       " '0743211375',\n",
       " '0385490992',\n",
       " '0425178765',\n",
       " '0060199652',\n",
       " '0316788228',\n",
       " '0446675059',\n",
       " '0316693006',\n",
       " '0553578022',\n",
       " '0553580191',\n",
       " '0345384350',\n",
       " '1400031362',\n",
       " '0345413881',\n",
       " '0515133973',\n",
       " '0515122734',\n",
       " '0440218535',\n",
       " '038542471X',\n",
       " '006019491X',\n",
       " '0451204530',\n",
       " '0446610542',\n",
       " '0064400557',\n",
       " '0345413873',\n",
       " '0446613266',\n",
       " '0312265859',\n",
       " '0446607193',\n",
       " '0679734775',\n",
       " '0553569155',\n",
       " '0399149325',\n",
       " '0425158632',\n",
       " '042513699X',\n",
       " '0684865742',\n",
       " '0679446486',\n",
       " '0425184226',\n",
       " '0345436911',\n",
       " '0316782505',\n",
       " '0671867091',\n",
       " '0452282195',\n",
       " '0451207521',\n",
       " '0671693816',\n",
       " '0399146431',\n",
       " '0385493800',\n",
       " '0316693235',\n",
       " '0316693200',\n",
       " '0385510438',\n",
       " '0380977788',\n",
       " '0316602906',\n",
       " '0451205421',\n",
       " '0060096195',\n",
       " '0140254544',\n",
       " '0743457358',\n",
       " '0316168688',\n",
       " '0316777730',\n",
       " '0399149155',\n",
       " '0515133302',\n",
       " '0425155404',\n",
       " '0440122090',\n",
       " '0451163966',\n",
       " '0345444884',\n",
       " '0425132951',\n",
       " '038542017X',\n",
       " '034536676X',\n",
       " '034538184X',\n",
       " '0553282476',\n",
       " '0399145087',\n",
       " '0316781142',\n",
       " '0688177751',\n",
       " '0804115761',\n",
       " '0449134482',\n",
       " '0515136379',\n",
       " '1592400876',\n",
       " '0743203631',\n",
       " '0425153975',\n",
       " '0446609323',\n",
       " '0142004235',\n",
       " '1573225517',\n",
       " '080213825X',\n",
       " '0446519138',\n",
       " '0091867770',\n",
       " '0373484224',\n",
       " '0451206525',\n",
       " '0767915054',\n",
       " '0684867621',\n",
       " '0671880314',\n",
       " '0553274295',\n",
       " '0553560247',\n",
       " '0552998486',\n",
       " '0553213148',\n",
       " '0446365505',\n",
       " '0671683993',\n",
       " '0375706410',\n",
       " '0380820293',\n",
       " '0060932759',\n",
       " '034543479X',\n",
       " '034539657X',\n",
       " '0312144075',\n",
       " '0399146253',\n",
       " '0446605409',\n",
       " '0316182540',\n",
       " '0425192733',\n",
       " '006099486X',\n",
       " '0312971125',\n",
       " '0345422317',\n",
       " '0553572326',\n",
       " '0425174271',\n",
       " '0451169522',\n",
       " '1573229571',\n",
       " '0316777722',\n",
       " '0345354613',\n",
       " '0375500510',\n",
       " '0425136981',\n",
       " '0373825013',\n",
       " '0330375253',\n",
       " '0345404114',\n",
       " '0671727583',\n",
       " '080411935X',\n",
       " '0553576801',\n",
       " '0609610597',\n",
       " '0515130966',\n",
       " '0425177173',\n",
       " '0060008032',\n",
       " '0451153553',\n",
       " '042518630X',\n",
       " '0451208765',\n",
       " '0425092917',\n",
       " '0425192725',\n",
       " '0380727501',\n",
       " '051511992X',\n",
       " '1551668998',\n",
       " '067976397X',\n",
       " '0446606383',\n",
       " '0061020710',\n",
       " '0804105820',\n",
       " '0374199698',\n",
       " '0140179836',\n",
       " '0156006529',\n",
       " '0684833395',\n",
       " '0671027662',\n",
       " '0515124214',\n",
       " '0451180232',\n",
       " '0679442790',\n",
       " '0385335830',\n",
       " '1576737330',\n",
       " '0385512104',\n",
       " '0312306326',\n",
       " '0060916508',\n",
       " '067101420X',\n",
       " '0440241162',\n",
       " '0440200989',\n",
       " '0060512822',\n",
       " '0446525502',\n",
       " '0451170385',\n",
       " '0449912558',\n",
       " '0553569058',\n",
       " '0373218400',\n",
       " '0842329250',\n",
       " '0451197747',\n",
       " '0553580930',\n",
       " '0553265741',\n",
       " '0446602620',\n",
       " '1573227331',\n",
       " '0316602051',\n",
       " '0345445848',\n",
       " '0446603929',\n",
       " '0345348109',\n",
       " '0553274503',\n",
       " '0425151867',\n",
       " '0553571818',\n",
       " '0679735771',\n",
       " '0345441036',\n",
       " '0446667900',\n",
       " '0312982518',\n",
       " '0425147517',\n",
       " '0425185710',\n",
       " '0373484003',\n",
       " '0446530522',\n",
       " '0894805770',\n",
       " '051512317X',\n",
       " '0671027581',\n",
       " '0385424736',\n",
       " '0446363251',\n",
       " '0671011375',\n",
       " '0688177859',\n",
       " '0446670111',\n",
       " '1400031346',\n",
       " '0553583441',\n",
       " '0743437802',\n",
       " '0345314255',\n",
       " '0452268060',\n",
       " '0312274920',\n",
       " '0385475721',\n",
       " '043936213X',\n",
       " '0743206029',\n",
       " '042517736X',\n",
       " '0449910237',\n",
       " '0451188454',\n",
       " '0312244266',\n",
       " '0553280414',\n",
       " '076790592X',\n",
       " '0515120618',\n",
       " '0887307876',\n",
       " '0425178579',\n",
       " '0385503954',\n",
       " '0345397819',\n",
       " '0345366239',\n",
       " '0380817691',\n",
       " '044661064X',\n",
       " '0345422384',\n",
       " '0380814021',\n",
       " '0345413865',\n",
       " '0316678104',\n",
       " '0345416260',\n",
       " '080411918X',\n",
       " '0671741195',\n",
       " '0451191145',\n",
       " '034538430X',\n",
       " '0804108749',\n",
       " '0425150143',\n",
       " '0451188462',\n",
       " '0446525537',\n",
       " '0425178102',\n",
       " '0425119653',\n",
       " '0345413369',\n",
       " '0671014919',\n",
       " '0786866586',\n",
       " '081297106X',\n",
       " '0345354621',\n",
       " '0425142485',\n",
       " '0451209907',\n",
       " '0380710722',\n",
       " '0449203794',\n",
       " '0671537458',\n",
       " '0743235150',\n",
       " '0671027344',\n",
       " '0425166619',\n",
       " '1558745718',\n",
       " '0440217490',\n",
       " '0140042598',\n",
       " '0452281903',\n",
       " '0425121631',\n",
       " '0425145638',\n",
       " '0671525743',\n",
       " '0515135739',\n",
       " '1400032717',\n",
       " '0385720920',\n",
       " '0671038443',\n",
       " '0374100128',\n",
       " '0375504397',\n",
       " '0316693251',\n",
       " '0743439740',\n",
       " '0425161242',\n",
       " '0446604844',\n",
       " '0312966806',\n",
       " '0425189864',\n",
       " '0451169514',\n",
       " '0312924801',\n",
       " '0385508417',\n",
       " '0786889020',\n",
       " '0446350982',\n",
       " '0679723161',\n",
       " '0312986343',\n",
       " '067169507X',\n",
       " '0679731725',\n",
       " '0671026011',\n",
       " '0375413634',\n",
       " '0375412530',\n",
       " '0446605581',\n",
       " '0425172996',\n",
       " '0553295977',\n",
       " '0446365386',\n",
       " '055357230X',\n",
       " '0316603287',\n",
       " '0425140032',\n",
       " '0440225825',\n",
       " '0060926317',\n",
       " '0684862719',\n",
       " '0671701231',\n",
       " '0316693286',\n",
       " '0140092323',\n",
       " '0425130711',\n",
       " '0670030643',\n",
       " '0446527785',\n",
       " '0671743058',\n",
       " '0553584510',\n",
       " '0553263226',\n",
       " '0440217563',\n",
       " '0446604232',\n",
       " '0312263120',\n",
       " '0553258001',\n",
       " '1573229725',\n",
       " '0743418131',\n",
       " '0440940001',\n",
       " '0425157539',\n",
       " '042510687X',\n",
       " '0099387913',\n",
       " '0425167720',\n",
       " '0425179613',\n",
       " '0449911519',\n",
       " '0451186923',\n",
       " '0525946829',\n",
       " '0312978383',\n",
       " '015100692X',\n",
       " '0451142934',\n",
       " '034540761X',\n",
       " '0671886665',\n",
       " '006092988X',\n",
       " '0312983298',\n",
       " '0385503857',\n",
       " '0446604275',\n",
       " '0312974256',\n",
       " '0553582763',\n",
       " '0671028367',\n",
       " '0446356832',\n",
       " '0805059555',\n",
       " '0345404769',\n",
       " '044661193X',\n",
       " '0767916069',\n",
       " '1565122968',\n",
       " '042518286X',\n",
       " '0373484232',\n",
       " '0312952716',\n",
       " '0446523569',\n",
       " '0679439382',\n",
       " '0446608262',\n",
       " '0156028778',\n",
       " '0451166582',\n",
       " '0553572210',\n",
       " '0373243286',\n",
       " '0425179885',\n",
       " '0679457526',\n",
       " '0425181103',\n",
       " '0425189031',\n",
       " '1558531025',\n",
       " '0553582658',\n",
       " '0345392825',\n",
       " '067697175X',\n",
       " '0060740450',\n",
       " '000649840X',\n",
       " '0312201656',\n",
       " '0671670689',\n",
       " '0553213172',\n",
       " '0689817851',\n",
       " '067100042X',\n",
       " '0440236738',\n",
       " '0028604199',\n",
       " '0679720200',\n",
       " '0515087122',\n",
       " '0440201926',\n",
       " '0345386132',\n",
       " '0670894605',\n",
       " '0373244487',\n",
       " '0440211891',\n",
       " '0812570944',\n",
       " '0425151875',\n",
       " '0440204194',\n",
       " '0425121259',\n",
       " '0671024094',\n",
       " '0671250671',\n",
       " '0553583468',\n",
       " '0451163524',\n",
       " '0671034022',\n",
       " '0553212583',\n",
       " '0446673544',\n",
       " '0553210092',\n",
       " '0805019375',\n",
       " '0156007479',\n",
       " '0441005489',\n",
       " '0553578316',\n",
       " '0743417682',\n",
       " '0553278029',\n",
       " '0451151259',\n",
       " '0767905202',\n",
       " '0440236053',\n",
       " '0316693324',\n",
       " '0743469801',\n",
       " '0345447867',\n",
       " '0425118703',\n",
       " '0671023616',\n",
       " '0553211404',\n",
       " '0375705198',\n",
       " '0060964049',\n",
       " '0440221315',\n",
       " '006109921X',\n",
       " '0345384377',\n",
       " '0553573403',\n",
       " '0812543262',\n",
       " '0316690619',\n",
       " '0805062971',\n",
       " '0060930187',\n",
       " '0385490445',\n",
       " '0786862564',\n",
       " '0064471047',\n",
       " '0590660543',\n",
       " '0671028383',\n",
       " '0330262130',\n",
       " '0345452569',\n",
       " '0425162788',\n",
       " '0375703764',\n",
       " '0671776134',\n",
       " '0385494246',\n",
       " '0553586122',\n",
       " '0061098795',\n",
       " '0425152898',\n",
       " '0380703882',\n",
       " '0385509456',\n",
       " '0446353205',\n",
       " '0446607207',\n",
       " '0440224705',\n",
       " '0553208845',\n",
       " '0440176484',\n",
       " '0451203593',\n",
       " '0373484429',\n",
       " '0446530077',\n",
       " '0373484410',\n",
       " '0786890436',\n",
       " '1857022424',\n",
       " '0679419462',\n",
       " '0552137030',\n",
       " '0061000175',\n",
       " '0679742298',\n",
       " '0425161722',\n",
       " '0451191013',\n",
       " '0345396936',\n",
       " '0060188731',\n",
       " '0553578308',\n",
       " '0446527165',\n",
       " '0345441133',\n",
       " '8873122933',\n",
       " '0451190491',\n",
       " '0385315236',\n",
       " '0345389964',\n",
       " '0553579983',\n",
       " '0380600129',\n",
       " '0425169693',\n",
       " '0373483694',\n",
       " '0399143947',\n",
       " '0515118656',\n",
       " '0440207622',\n",
       " '0375414053',\n",
       " '0142002267',\n",
       " '0684857820',\n",
       " '155166674X',\n",
       " '0446611476',\n",
       " '0446604402',\n",
       " '0385314698',\n",
       " '0671741187',\n",
       " '0385482388',\n",
       " '0671729411',\n",
       " '055356773X',\n",
       " '0451155750',\n",
       " '0439404371',\n",
       " '0671002481',\n",
       " '1931561648',\n",
       " '0671695126',\n",
       " '0446602612',\n",
       " '0553583980',\n",
       " '0061031992',\n",
       " '0446609943',\n",
       " '0312979096',\n",
       " '0446613843',\n",
       " '0446601640',\n",
       " '0375400117',\n",
       " '0440220424',\n",
       " '0805036504',\n",
       " '0553562614',\n",
       " ...]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 防止某些地区没有用户，取评分最高的商品进行推荐\n",
    "top2000_item_id_s = df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "top2000_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0440234743</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0452264464</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>14</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0971880107</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345402871</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345417623</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id location  age     item_id  rating\n",
       "20        9      usa    0  0440234743       0\n",
       "21        9      usa    0  0452264464       6\n",
       "29       14      usa    0  0971880107       0\n",
       "30       16      usa    0  0345402871       9\n",
       "31       16      usa    0  0345417623       0"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#\n",
    "df_data_training_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "df_data_training_top2000.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1844262553',\n",
       " '0439139597',\n",
       " '0439136350',\n",
       " '0439064864',\n",
       " '0877017883',\n",
       " '0618002227',\n",
       " '0590353403',\n",
       " '0671027344',\n",
       " '0385199570',\n",
       " '0771060548',\n",
       " '0156528207',\n",
       " '0618129022',\n",
       " '0552128481',\n",
       " '0552131059',\n",
       " '0811801802',\n",
       " '0670032379',\n",
       " '0812550706',\n",
       " '0679785892',\n",
       " '0670894605',\n",
       " '0811825558']"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取前20最受欢迎商品\n",
    "top20_item_id_s = df_data_training_top2000.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20].index.tolist()\n",
    "top20_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 每一个特征对应的推荐列表\n",
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "#         print(location,age)\n",
    "        feature_recommand_len = len(feature_recommand[location][age])\n",
    "        feature_recommand[location][age] += top20_item_id_s[:20-feature_recommand_len]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'n/a': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0679785892']}})"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入测试集\n",
    "\n",
    "df_data_text = cPickle.load(open('./data/df_data_text.pkl','rb'))\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 344931 entries, 109814 to 473426\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count   Dtype \n",
      "---  ------    --------------   ----- \n",
      " 0   user_id   344931 non-null  int64 \n",
      " 1   location  344931 non-null  object\n",
      " 2   age       344931 non-null  int64 \n",
      " 3   item_id   344931 non-null  object\n",
      " 4   rating    344931 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 14.5+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data_text.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "top_location_s = list(feature_recommand.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n",
    "# 对location进行处理\n",
    "df_data_text['location'] = df_data_text['location'].apply(lambda location : location if location in top_location_s else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "union_quantity = 0\n",
    "recommand_quantity = 0\n",
    "user_fav_quantity = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "执行到： australia 0\n",
      "执行到： australia 1\n",
      "执行到： australia 2\n",
      "执行到： australia 3\n",
      "执行到： australia 4\n",
      "执行到： australia 5\n",
      "执行到： canada 0\n",
      "执行到： canada 1\n",
      "执行到： canada 2\n",
      "执行到： canada 3\n",
      "执行到： canada 4\n",
      "执行到： canada 5\n",
      "执行到： france 0\n",
      "执行到： france 2\n",
      "执行到： france 3\n",
      "执行到： france 4\n",
      "执行到： france 5\n",
      "执行到： germany 0\n",
      "执行到： germany 1\n",
      "执行到： germany 2\n",
      "执行到： germany 3\n",
      "执行到： germany 4\n",
      "执行到： germany 5\n",
      "执行到： italy 0\n",
      "执行到： italy 2\n",
      "执行到： italy 3\n",
      "执行到： italy 4\n",
      "执行到： n/a 0\n",
      "执行到： other 0\n",
      "执行到： other 1\n",
      "执行到： other 2\n",
      "执行到： other 3\n",
      "执行到： other 4\n",
      "执行到： other 5\n",
      "执行到： portugal 0\n",
      "执行到： portugal 2\n",
      "执行到： portugal 3\n",
      "执行到： portugal 4\n",
      "执行到： portugal 5\n",
      "执行到： spain 0\n",
      "执行到： spain 2\n",
      "执行到： spain 3\n",
      "执行到： spain 4\n",
      "执行到： spain 5\n",
      "执行到： united kingdom 0\n",
      "执行到： united kingdom 1\n",
      "执行到： united kingdom 2\n",
      "执行到： united kingdom 3\n",
      "执行到： united kingdom 4\n",
      "执行到： united kingdom 5\n",
      "执行到： usa 0\n",
      "执行到： usa 1\n",
      "执行到： usa 2\n",
      "执行到： usa 3\n",
      "执行到： usa 4\n",
      "执行到： usa 5\n",
      "准确率: 0.0003806202422469719\n",
      "召回率: 0.0032610965638002216\n"
     ]
    }
   ],
   "source": [
    "for location,groupby_location in df_data_text.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        print('执行到：',location,age)\n",
    "        for user_id,groupby_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = groupby_location_age_userid.groupby('item_id')['rating'].mean().sort_values(ascending=False)\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            recommand_items = feature_recommand[location][age]\n",
    "            union_quantity += len(\n",
    "                set(user_fav_items) & set(recommand_items)\n",
    "            )\n",
    "            recommand_quantity += len(recommand_items)\n",
    "            user_fav_quantity += len(user_fav_items)\n",
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
